/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Util;

import java.io.ByteArrayInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 *
 * @author dalia
 */
public class MD5
{

    /**
     * Metodo que genera el hash MD5
     * @param data Cadena de la cual queremos calcular el hash MD5
     * @param key Clave que emplearemos en el calculo del hash.
     * @return Un array de bits con el valor resultante del hash
     */
    public static byte[] getHashMD5(String data, String key)
    {
        try
        {
            //Generamos un objeto MessageDigest que implementa el algoritmo MD5
            //esto puede lanzar una NoSuchAlgorithmException si el algoritmo
            //no está soportado. Pero se supone que esto no debe ocurrir
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] textBytes = data.getBytes(); //raw-bytes del texto de entrada
            //Actulizamos el digest
            md5.update(textBytes);
            //En ocasiones se quiere aplicar una clave al algoritmo, esto
            //se consigue actualizando el digest con los bytes de la clave
            //Esto se utiliza por ejemplo en el método de autentificación
            //APOP de POP3 en el que a una marca de tiempo (timestamp)
            //se le aplica el algorimto MD5 con la contrase?a de usuario
            //como clave.
            //En el protocolo MSN el método de autentificación es similar
            //Realmente obtendremos el mismo resultado si concatenamos
            //los datos y la clave y asumimos la clave como una
            //cadena de longitud cero. Esto se puede comprobar en el ejemplo del main()
            byte[] result = md5.digest();

            return result;
        }
        catch (NoSuchAlgorithmException e)
        {
            //esto ocurre si el algoritmo MD5 no está soportado
            return null;
        }
    }

    /**
     * Convierte un byte[] a un String con su valor equivalente en hexadecimal
     * De gran utilidad para convertir el hash calculado con getHashMD5
     * a hexadecimal
     * @param datos
     * @return
     */
    public static String toHexadecimal(byte[] datos)
    {
        String resultado = "";
        ByteArrayInputStream input = new ByteArrayInputStream(datos);
        String cadAux;
        int leido = input.read();
        while (leido != -1)
        {
            cadAux = Integer.toHexString(leido);
            if (cadAux.length() < 2) //Hay que añadir un 0
            {
                resultado += "0";
            }
            resultado += cadAux;
            leido = input.read();
        }
        return resultado;
    }
}
